'''
Created on 9 janv. 2015

@author: cyhay
'''

import numpy as np
import matplotlib.pyplot as plt

from numpy import random
from math import sqrt

n = 16

#Definition des Tableaux de coordonnes
def create_Zx_Zy(n):
    #Generation d'un tableau de coordonnees Zx
    Zx = np.array(np.tile(np.arange(n),(n,1)), dtype = np.float64) + 1
    print("Affichage de Zx\n")
    print(Zx)
    
    #Generation du tableau de coordonnes Zy qui correspond, par definition, au transpose de Zx 
    Zy=Zx.T
    print("Affichage de Zy\n")
    print(Zy)
    
    return Zx,Zy

#Calcul des matrices A et B
def calcul_A_B(Pxx,Pxz, Pzz):
    #Debut de l'inversion de la matrice Pzz
    #SVD de la matrice Pzz a l'aide de la fonction linalg.svd() de numpy
    U, S, V = np.linalg.svd(Pzz)
    
    #Diagonalisation de la matrice S
    D = np.diag(1./S) 
    
    #Calcul de la matrice inverse de Pzz
    Inv_Pzz = np.dot(np.dot(V.T, D), U.T) 
    #Fin de l'inversion de la matrice Pzz
    
    
    #Calcul de la matrice A
    A = np.dot(Pxz, Inv_Pzz)
    
    #Calcul de la matrice B
    #calcul de Pzx
    Pzx = Pxz.T
    
    #Calcul du produit et de la difference
    produit = np.dot(Pxz, Inv_Pzz, Pzx)
    B_carre = Pxx - produit
    B = sqrt(B_carre)
    
    return A,B

#Calcul de la fonction Iteration 
def iteration(X, A, B, Z, Zref):
    #Generation du vecteur G a partir d'un generateur de nombres aleatoires suivant une distribution normale, de variance unitaire et de moyenne nulle
    G = np.random.normal(0, 1, (n))
    
    #On conserve tout le tableau sauf la premiere colonne
    X_current = X[:,1:n]
    
    #Calcul de l'iteration
    ajout_col = (np.dot(A, (Z-Zref)) + np.dot(B,G)) + Zref
    
    #On ajoute la derniere colonne au tableau que l'on a sauvegarde
    X = [X_current,ajout_col]
    
    return ajout_col